package com.itheima.threadtest1;

/**
 * 多线程的第一种安全问题：
 *      当多个线程在共享同一个数据变量时
 *      会出现重号 顺序不对 号小于临界值等问题
 *      -- 重号是因为每个线程都要睡一下 他睡觉的时候CPU被抢走 待会儿好几个线程一起醒来他打印的就是那个时刻的票号了
 *      -- 顺序不对
 *      -- 超号的票 线程先进入了 if 的判断(通过了) 然后其他线程把票号加到了100以上 然后这个线程再回来打印他
 *
 *      根本原因是：判断能不能进入临界区和操作临界区的代码不是一气呵成的        -->同步代码块
 *
 *      synchronized 设置成同步代码块 传入一个任意变量 ->信号量
 *      特点：只要有一个线程进去了 信号量就设为 0 相当于 锁关闭
 *              只有线程出来了 锁才打开        --> 互斥访问
 *
 *      直接包围这块代码也有问题
 *              因为不允许调度 所以第一个进入的会一直把票卖完了再出来
 *              所以不能把循环放在同步代码块里面
 */
public class ThreadDemo {


    /**
     * 一共 1000 张电影票 两个窗口可以领取 每次领取时间 3 s             -->>>互斥访问
     * 用多线程模拟买票过程并打印剩余票数                              -->>>显然消费者生产者问题是同步问题
     * @param args
     */
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        MyThread myThread3 = new MyThread();

        myThread1.setName("窗口1");
        myThread2.setName("窗口2");
        myThread3.setName("窗口3");

        myThread1.start();
        myThread2.start();
        myThread3.start();
    }
}
